摘要
Day 25 把 Day 24 的 AuditEvent / Provenance readiness evidence 往前推一步:report 不只列出 input SHA-256、contract、gate outcome 和各 evidence layer 狀態,現在也會產生 request-scoped FHIR R4AuditEvent與ProvenanceJSON preview。Day 25 的重點不是 production audit workflow,而是讓 Quality Test Report 可以證明:未來若要接 persistent audit log 或外部 FHIR repository,最小 FHIR resource shape 已經存在。
Day 24 可以回答:
如果下一步要落地 AuditEvent / Provenance,最小 evidence 欄位在哪裡?
但正式交換前還有一個更具體的問題:
這些 evidence 欄位能不能形成實際 FHIR R4 AuditEvent / Provenance resource?
如果一個 quality gate 只能顯示文字 evidence,卻無法把 validation action、input hash、contract version、gate outcome 和各 readiness layer 狀態組成 FHIR resource,那它離 audit / provenance integration 還差一層。
Day 25 的目標不是變成 production audit platform。
Day 25 的目標是:
Audit / Provenance readiness evidence -> request-scoped FHIR resource preview
也就是說,今天新增的是「可落地的 audit / provenance resource shape」:
AuditEvent / Provenance 寫到外部 FHIR server。AuditEvent / Provenance JSON preview。例如同一份 Bundle 進來時,Day 25 的判斷會是:
| 情境 | 結果 |
|---|---|
| validation 尚未執行 | Audit / Provenance preview NOT_EVALUATED,不產生 resource JSON |
| validation 已執行但 sandbox / terminology 未提供 URL | resource JSON 仍會產生,狀態以 NOT_EVALUATED 寫入 evidence |
Quality Gate PASSED 或 PASS_WITH_WARNINGS |
AuditEvent.outcome 使用 success evidence |
Quality Gate BLOCKED |
AuditEvent.outcome 使用 failure evidence |
| input Bundle 含 Patient resource | preview 只使用 SHA-256,不輸出 raw Bundle 或 direct Patient identifier |
這讓 report 可以明確說明:
AuditEvent / Provenance 已能生成 request-scoped FHIR preview。
但目前只展示,不持久化也不提交。
Day 25 的 request / report flow 變成:
使用者上傳 Bundle
│
├─ 執行原本 JSON / FHIR / TW Core / contract rules
│
├─ terminology server evidence
│ ├─ ValueSet/$expand
│ └─ ValueSet/$validate-code
│
├─ live FHIR metadata evidence
│ └─ GET {FHIR_BASE_URL}/metadata
│
├─ sandbox readiness evidence
│ ├─ non-PHI preflight
│ ├─ sandbox auth boundary
│ └─ CapabilityStatement interaction declarations
│
├─ privacy / retention evidence
│ ├─ masked field categories
│ └─ retention policy = request-scoped only / no persistent history
│
└─ AuditEvent / Provenance resource preview
├─ input SHA-256
├─ selected contract id/version
├─ gate outcome
├─ rule count
├─ terminology status
├─ metadata status
├─ sandbox status
└─ generation policy = generated request-scoped only; not persisted; not submitted
最後 Quality Test Report 的 evidence layer 變成:
Quality Gate blocking result
├─ FHIR / TW Core / contract local rules
├─ Terminology server evidence
├─ Live FHIR metadata evidence
├─ Sandbox readiness evidence
├─ Privacy / retention evidence
└─ AuditEvent / Provenance resource preview evidence
├─ AuditEvent JSON preview
├─ Provenance JSON preview
└─ generation policy
Day 25 新增的 AuditEvent 是 request-scoped preview。
它會記錄:
AuditEvent.outcome 目前對應:
| Gate outcome | AuditEvent outcome |
|---|---|
PASSED |
success evidence |
PASS_WITH_WARNINGS |
success evidence |
BLOCKED |
failure evidence |
這不是在宣稱已完成正式 audit workflow。
Day 25 的 AuditEvent preview 不包含:
它只是把 Day 24 的 readiness 欄位整理成 FHIR R4 AuditEvent resource preview,讓下一步可以接 persistent audit 或 external FHIR write。
Day 25 新增的 Provenance 也是 request-scoped preview。
它會記錄:
TW Lab Contract Gate。urn:sha256:{inputHash}。這個 layer 的定位是:
report generation provenance evidence
不是 production resource lineage repository
原因是 Day 25 還沒有 database-backed history、stable report id、operator identity、access control、retention deletion workflow,也沒有把 Provenance 寫入外部 FHIR server。
Day 25 不手刻 JSON 字串。
今天新增 AuditProvenanceResourceService,用 HAPI FHIR R4 model 建立:
org.hl7.fhir.r4.model.AuditEvent
org.hl7.fhir.r4.model.Provenance
然後再透過 HAPI JSON parser serialize。
這讓 preview 至少具備兩個 evidence:
resource shape 來自 FHIR R4 model
JSON serialization 來自 HAPI parser
report 只顯示 readonly preview:
AuditEvent resource preview
Provenance resource preview
Day 25 不把 raw Bundle 寫入 AuditEvent 或 Provenance。
preview 使用:
urn:sha256:{inputHash}
來指向輸入 Bundle 的 hash。
它不應輸出:
Patient.name
Patient.identifier.value
Patient.telecom
Patient.address
Patient.birthDate
Generation policy 明確顯示:
generated request-scoped only; not persisted; not submitted
這表示目前版本仍然不會把 uploaded Bundle、terminology response、FHIR metadata response、sandbox response、AuditEvent 或 Provenance 寫進資料庫,也不會送到外部 FHIR server。
AuditProvenanceResourceService
AuditProvenanceResources
AuditProvenanceReadinessResult 也新增三個欄位:
auditEventJson
provenanceJson
resourceGenerationPolicy
AuditProvenanceReadinessService 從單純文字 readiness evidence,改成同時呼叫 resource generation service 產生 request-scoped preview。
今天新增測試確認:
AuditEvent JSON 可被 HAPI parse 回 AuditEvent。Provenance JSON 可被 HAPI parse 回 Provenance。AuditEvent preview 包含 input SHA-256、contract、gate outcome、rule count、terminology status、metadata status、sandbox status。Provenance preview 使用 urn:sha256:{inputHash} 指向 hashed Bundle source。AuditEvent resource preview。Provenance resource preview。generated request-scoped only; not persisted; not submitted。目前測試結果:
Tests run: 101, Failures: 0, Errors: 0, Skipped: 0
完成後,專案的定位變成:
pre-exchange quality gate
├─ FHIR / TW Core validation
├─ partner contract rules
├─ contract lifecycle / compatibility
├─ unit normalization evidence
├─ terminology server evidence
├─ metadata preflight
├─ sandbox readiness evidence
├─ privacy / retention evidence
└─ request-scoped AuditEvent / Provenance preview
但它仍然不是:
之後預計從 Day 25 的 preview 往下做:
AuditEvent / Provenance write policy。Repository:twcore-data-quality-gate